home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / AUDIT.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  3KB  |  122 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4.  
  5. extern char _Uend;
  6. extern int _STKRED;
  7.  
  8. union header {
  9.     struct {
  10.         union header *ptr;
  11.         unsigned size;
  12.     } s;
  13.     long l;
  14. };
  15.  
  16. void audit __ARGS((struct mbuf *bp,char *file,int line));
  17. static void audit_mbuf __ARGS((struct mbuf *bp,char *file,int line));
  18. static void dumpbuf __ARGS((struct mbuf *bp));
  19.  
  20. /* Perform sanity checks on mbuf. Print any errors, return 0 if none,
  21.  * nonzero otherwise
  22.  */
  23. void
  24. audit(bp,file,line)
  25. struct mbuf *bp;
  26. char *file;
  27. int line;
  28. {
  29.     register struct mbuf *bp1;
  30.  
  31.     for(bp1 = bp;bp1 != NULLBUF; bp1 = bp1->next)
  32.         audit_mbuf(bp1,file,line);
  33. }
  34.  
  35. static void
  36. audit_mbuf(bp,file,line)
  37. register struct mbuf *bp;
  38. char *file;
  39. int line;
  40. {
  41.     union header *blk;
  42.     char *bufstart,*bufend;
  43.     int16 overhead = sizeof(union header) + sizeof(struct mbuf);
  44.     int16 datasize;
  45.     int errors = 0;
  46.     char *heapbot,*heaptop;
  47.  
  48.     if(bp == NULLBUF)
  49.         return;
  50.  
  51.     heapbot = &_Uend;
  52.     heaptop = (char *) -_STKRED;
  53.  
  54.     /* Does buffer appear to be a valid malloc'ed block? */
  55.     blk = ((union header *)bp) - 1;
  56.     if(blk->s.ptr != blk){
  57.         printf("Garbage bp %lx\n",(long)bp);
  58.         errors++;
  59.     }
  60.     if((datasize = blk->s.size*sizeof(union header) - overhead) != 0){
  61.         /* mbuf has data area associated with it, verify that
  62.          * pointers are within it
  63.          */
  64.         bufstart = (char *)(bp + 1);
  65.         bufend = (char *)bufstart + datasize;
  66.         if(bp->data < bufstart){
  67.             printf("Data pointer before buffer\n");
  68.             errors++;
  69.         }
  70.         if(bp->data + bp->cnt > bufend){
  71.             printf("Data pointer + count past bounds\n");
  72.             errors++;
  73.         }
  74.     } else {
  75.         /* Dup'ed mbuf, at least check that pointers are within
  76.          * heap area
  77.         */
  78.  
  79.         if(bp->data < heapbot
  80.          || bp->data + bp->cnt > heaptop){
  81.             printf("Data outside heap\n");
  82.             errors++;
  83.         }
  84.     }
  85.     /* Now check link list pointers */
  86.     if(bp->next != NULLBUF && ((bp->next < (struct mbuf *)heapbot)
  87.          || bp->next > (struct mbuf *)heaptop)){
  88.             printf("next pointer out of limits\n");
  89.             errors++;
  90.     }
  91.     if(bp->anext != NULLBUF && ((bp->anext < (struct mbuf *)heapbot)
  92.          || bp->anext > (struct mbuf *)heaptop)){
  93.             printf("anext pointer out of limits\n");
  94.             errors++;
  95.     }
  96.     if(errors != 0){
  97.         dumpbuf(bp);
  98.         printf("PANIC: buffer audit failure in %s line %d\n",file,line);
  99.         fflush(stdout);
  100.         for(;;)
  101.             ;
  102.     }
  103.     return;
  104. }
  105.  
  106. static void
  107. dumpbuf(bp)
  108. struct mbuf *bp;
  109. {
  110.     union header *blk;
  111.     if(bp == NULLBUF){
  112.         printf("NULL BUFFER\n");
  113.         return;
  114.     }
  115.     blk = ((union header *)bp) - 1;
  116.     printf("bp %lx tot siz %u data %lx cnt %u next %lx anext %lx\n",
  117.         (long)bp,blk->s.size * sizeof(union header),
  118.         (long)bp->data,bp->cnt,
  119.         (long)bp->next,(long)bp->anext);
  120. }
  121.  
  122.